//
import java.sql.*;
import javax.swing.*;
import oracle.jdbc.*;
//
/**<h3>Bev&ouml;lkerungsdatensatz.</h3>
 * <div>Die Klasse <code>Datensatz</code> definiert einen kompletten Datensatz
 * der Tabelle <code>Bevoelkerung</code>. Zus&auml;tzlich bietet sie einige
 * statische Methoden, die Instanzen dieser Klasse liefern. Die Inhalte werden
 * mit Hilfe der Klasse <code>Verbindung</code> aus der Datenbank geholt.</div>
 * @author Dr. Gerd Wegener
 * @version 0004 Dienstag 03.05.2011 11:00:25
 * @modified:  
 * @version 0007 Samstag 16.07.2011 14:38:12
 * @author Hung Nguyen Huu <hung852001@yahoo.com>
 * @author Viktor Ayzenshtadt <vsa85@gmx.de>
 */
public class Datensatz{
// Verbindungsobjekt, muss nicht jedesmal neu gemacht werden
   public static Verbindung verbindung;
//
// Daten
   private String quekode, quename, gebkode, gebname, sexkode, sexname;
//
   private int gesamt, jahr;
   private int [] altgru;
//
// Konstruktor
// Hier werden nur die Daten genommen, um eine Instanz zu erzeugen.
   private Datensatz(String quekode, String gebkode, int jahr, String sexkode, int gesamt, int [] altgru) throws SQLException{
      this.quekode = quekode;   quename = getQuellenName(quekode);
      this.sexkode = sexkode;
      sexname = sexkode.toUpperCase().equals("M+W") ? "m+w" : (sexkode.toUpperCase().startsWith("M") ? "m" : "w");
      this.gesamt = gesamt;   this.altgru = altgru.clone();
   }
//
/**<h4>Originaldaten.</h4>
 * @param quekode Quellenkode
 * @param gebkode Gebietskode
 * @param jahr Jahr
 * @param sexkode Geschlecht ("m": m&auml;nnlich, "w": weiblich)
 * modified: 12.07.2011, 11:05:30	
 * @author: Hung Nguyen Huu <hung852001@yahoo.com>
 */
   public static String[] getDaten(String gebkode, int jahrVon, int jahrBis, String sexkode){
	String datensatz = "";
	String[] datensatzArray = {""};
//
//    Verbindung nehmen oder neu herstellen
      if (verbindung==null) verbindung = new Verbindung();
//
//    wenn keine Instanz erzeugt werden konnte, besteht keine Verbindung
      if (verbindung==null) JOptionPane.showMessageDialog(null,"Keine Verbindung!");
      else
      {
//       Daten aus der Datenbank holen
         try
         {
//          1. Verbindungsobjekt holen
            Connection conn = verbindung.getConnection();
//
//          2. Anweisungsobjekt erzeugen
            Statement stmt = conn.createStatement();
//
//          3. Anweisung ausfuehren
	    // nach Geschlecht abfragen
	    ResultSet erg;
	    // nach Jahren abfragen
	    if(jahrVon == -1 && jahrBis == -1){ //  jahrVon & jahrBis leer, alle Jahre ab 1950
		//JOptionPane.showMessageDialog(null, "beide leer");
		if(sexkode.equals("m+w")) { // Option "maennlich + weiblich" wurde ausgewählt
		    erg = stmt.executeQuery
		       ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
		        "') AND (JAHR >= '1950') "
		       );
	    	}else
		    erg = stmt.executeQuery
		       ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
		        "') AND (JAHR >= '1950') AND (GESCHLECHT='"+sexkode+"')"
		       );
	    }
//
	    else if(jahrVon == -1){	// jahrVon leer
			//JOptionPane.showMessageDialog(null, "JahrVon leer. jahrBis = "+jahrBis );
			if(sexkode.equals("m+w")){
				erg = stmt.executeQuery
				   ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
				"') AND (JAHR <= '" + jahrBis +"') "
				   );
			}else		
			erg = stmt.executeQuery
				   ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
				"') AND (JAHR <='" + jahrBis +
				"') AND (GESCHLECHT='"+sexkode+"')"
				   );
 	    }
//	
	    else if(jahrBis == 0){	// jahrBis = jahrVon --> es wird nur nach einem Jahr gesucht!
			//JOptionPane.showMessageDialog(null, "jahrBis leer. jahrVon = "+jahrVon);
			if(sexkode.equals("m+w")){
				erg = stmt.executeQuery
			       ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
				"') AND (JAHR = '" + jahrVon +
				"') "
			       );
			}else
			erg = stmt.executeQuery
			       ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
				"') AND (JAHR ='" + jahrVon +
				"') AND (GESCHLECHT='"+sexkode+"')"
			       );
	   }	

	   else if(jahrBis == -1){	// jahrBis leer
			//JOptionPane.showMessageDialog(null, "jahrBis leer. jahrVon = "+jahrVon);
			if(sexkode.equals("m+w")){
				erg = stmt.executeQuery
			       ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
				"') AND (JAHR >= '" + jahrVon +
				"') "
			       );
			}else
			erg = stmt.executeQuery
			       ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
				"') AND (JAHR >='" + jahrVon +
				"') AND (GESCHLECHT='"+sexkode+"')"
			       );
	   }
	    else {			// jahrVon und jahrBis vorhanden
		//JOptionPane.showMessageDialog(null, "beide vorhanden. jahrVon = "+jahrVon+ "; jahrBis = "+jahrBis);
			if(sexkode.equals("m+w")){
				erg = stmt.executeQuery
			       ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
			        "') AND (JAHR >= '" + jahrVon + 
			        "') AND (JAHR <= '" + jahrBis +
				"') "
			       );
			}else		
				erg = stmt.executeQuery
				       ("select * from BEVOELKERUNG where (GEBIET='" + gebkode +
				        "') AND (JAHR >='" + jahrVon + 
				        "') AND (JAHR <='" + jahrBis +
					"') AND (GESCHLECHT='"+sexkode+"')"
				       );
	    }
//
//          4. Daten aus Ergebnisobjekt extrahieren
			
            while (erg.next()){
              /*
               int n = 19;   int [] ag = new int[n];
               for (int i=0; i<n; i++) ag[i] = erg.getInt(i+6); // ? Was soll das sein?
              */

				for (int i = 1; i<25; i++){
				 	datensatz += erg.getString(i) + ";";
				}
			 	//datensatz += erg.getString(1) + " | " + erg.getString(2) + " | " + erg.getInt(3)+ " | " + erg.getString(4)+ " | " + erg.getInt(5) + ";";
				//datensatz += ";"; 
            }
            datensatzArray = datensatz.split("\\;");
           
            //datensatz = datensatz.substring(1, datensatz.length()-2);				// löscht das erste und die beiden letzten Zeichen des Strings
//
//          5. Ergebnis-, Anweisungs- und Verbindungsobjekt schliessen
            erg.close();   stmt.close();
         }
         catch (SQLException sqle) { System.out.println(sqle.toString()); }
      }
      return datensatzArray;
   }
//
/**<h4>Quellenname.</h4>
 * @param quekode Quellenkode
 * @return Name zu quekode
 */
   public static String getQuellenName(String quekode)
   {
//    Name
      String name = "";
//
//    Verbindung nehmen oder neu herstellen
      if (verbindung==null) verbindung = new Verbindung();
//
//    nur, wenn eine Verbindung besteht
      if (verbindung!=null)
      {
//       Daten aus der Datenbank holen
         try
         {
//          1. Verbindungsobjekt holen
            Connection conn = verbindung.getConnection();
//
//          2. Anweisungsobjekt erzeugen
            Statement stmt = conn.createStatement();
//
//          3. Anweisung ausfuehren
            ResultSet erg = stmt.executeQuery("select NAME from QUELLE where KODE='" + quekode + "'");
//
//          4. Daten aus Ergebnisobjekt extrahieren
            if (erg.next()) name = erg.getString(1);
//
//          5. Ergebnis-, Anweisungs- und Verbindungsobjekt schliessen
            erg.close();   stmt.close();
         }
         catch (SQLException sqle) { System.out.println(sqle.toString()); }
      }
      return name;
   }
//
/**<h4>Gebietsname.</h4>
 * @param gebkode Gebietskode
 * @return Name zu gebkode als String (H+V)
 */
   public static String[] getGebietsName(String gebkode)
   {
//    Name
      String name = "";
      String[] arrayKode = {""};
//
//    Verbindung nehmen oder neu herstellen
      if (verbindung==null) verbindung = new Verbindung();
//
//    nur, wenn eine Verbindung besteht
      if (verbindung!=null)
      {
//       Daten aus der Datenbank holen
         try
         {
//          1. Verbindungsobjekt holen
            Connection conn = verbindung.getConnection();
//
//          2. Anweisungsobjekt erzeugen
            Statement stmt = conn.createStatement();
//
//          3. Anweisung ausfuehren
            ResultSet erg = stmt.executeQuery("select NAME, KODE from GEBIET where LOWER(kode) like '%" + gebkode + "%'");
//
//          4. Daten aus Ergebnisobjekt extrahieren  // modifiziert!
            while (erg.next()) name += erg.getString(2) + " (" + erg.getString(1) + ")" + ";";
			arrayKode = name.split("\\;");
//
//          5. Ergebnis-, Anweisungs- und Verbindungsobjekt schliessen
            erg.close();   stmt.close();
         }
         catch (SQLException sqle) { System.out.println(sqle.toString()); }
      }
      return arrayKode;
   }

/**<h4>String</h4>
 * @return Datensatz als StringArray(H+V)
 */
    public static String[] getGebietsKode(String gebname){
//    Name
      String name = "";
      String kode = "";
      String[] arrayName = {""};
//
//    Verbindung nehmen oder neu herstellen
      if (verbindung==null) verbindung = new Verbindung();
//
//    nur, wenn eine Verbindung besteht
      if (verbindung!=null)
      {
//       Daten aus der Datenbank holen
         try
         {
//          1. Verbindungsobjekt holen
            Connection conn = verbindung.getConnection();
//
//          2. Anweisungsobjekt erzeugen
            Statement stmt = conn.createStatement();
//
//          3. Anweisung ausfuehren
	    char stern = '*';			// gesuchte Zeichen/Operatoren definieren
	    char frageZeichen = '?';
	    int findeStern = gebname.indexOf(stern); // Zeichen im String finden
	    int findefrageZeichen = gebname.indexOf(frageZeichen);
		
	    // nach Ortsnamen suchen mit Hilfe von Trunkierungen/Platzhalter
	    if(findeStern >= 0 || findefrageZeichen >= 0){		// Ein von den 2 Zeichen werden gefunden
			gebname = gebname.replace('*', '%');		// '*' wird für die SQL-Abfrage mit '%' ersetzt -> beliebig viele Zeichen
			gebname = gebname.replace('?', '_');		// '?' wird für die SQL-Abfrage mit '_' ersetzt -> genau ein Zeichen	

			// SchluesslSuche 
			if (gebname.charAt(0)=='#'){			// mit dem #-Zeichen nach Schlüssel suchen
				gebname = gebname.substring(1, gebname.length());
			    	ResultSet erg = stmt.executeQuery("select NAME, KODE from GEBIET where LOWER(kode) like '" + gebname + "' order by KODE" );
				//	KodeDaten aus Ergebnisobjekt extrahieren
				while (erg.next()) kode += "[" + erg.getString(2) + "] " + erg.getString(1) + ";";
				arrayName = kode.split("\\;");	
				//      Ergebnis-, Anweisungs- und Verbindungsobjekt schliessen
			  	erg.close();   stmt.close();	
			}else {	// GebietSuche
				ResultSet erg = stmt.executeQuery("select NAME, KODE from GEBIET where LOWER(name) like '" + gebname + "' order by NAME");
				//	Daten aus Ergebnisobjekt extrahieren
				while (erg.next()) name +=  "[" + erg.getString(2) + "] " + erg.getString(1) + ";";
				arrayName = name.split("\\;");
				//      Ergebnis-, Anweisungs- und Verbindungsobjekt schliessen
		    		erg.close();   stmt.close();
			}
	    }
	    else {
		if (gebname.charAt(0)=='#'){			// mit dem #-Zeichen nach Schlüssel suchen
				gebname = gebname.substring(1, gebname.length());
			    	ResultSet erg = stmt.executeQuery("select NAME, KODE from GEBIET where LOWER(kode) like '" +gebname+ "%' order by KODE" );
				//	KodeDaten aus Ergebnisobjekt extrahieren
				while (erg.next()) kode += "[" + erg.getString(2) + "] " + erg.getString(1) + ";";
				arrayName = kode.split("\\;");	
				//      Ergebnis-, Anweisungs- und Verbindungsobjekt schliessen
			  	erg.close();   stmt.close();
		}else{
		// eingegebener String direkt vergleichen!
			ResultSet erg = stmt.executeQuery("select NAME, KODE from GEBIET where LOWER(name) like '" + gebname + "%' order by NAME");
		//	4. Daten aus Ergebnisobjekt extrahieren
			while (erg.next()) name +=  "[" + erg.getString(2) + "] " + erg.getString(1) + ";";
			arrayName = name.split("\\;");
		//      5. Ergebnis-, Anweisungs- und Verbindungsobjekt schliessen
	    		erg.close();   stmt.close();
	   	} 
	   }
         }
         catch (SQLException sqle) { System.out.println(sqle.toString()); }
      }
	// Ausgabe über den gefundenen Datensätzen 
	if(arrayName.length == 1 && arrayName[0] == "" && gebname == "reset") return arrayName;  // Abfangen bei Reset Button
	else if(arrayName.length == 1 && arrayName[0] == "") JOptionPane.showMessageDialog(null, "FEHLER! Kein Treffer wurde gefunden. Versuchen Sie's erneut.", "Fehler", JOptionPane.ERROR_MESSAGE);
	else if(arrayName.length == 1 && arrayName[0] != "") JOptionPane.showMessageDialog(null, arrayName.length + " Datensatz wurde gefunden.");
	else
	JOptionPane.showMessageDialog(null, arrayName.length + " Datensaetze wurden gefunden.");
      return arrayName;
   }
   
//
/**<h4>String</h4>
 * @return Datensatz als String
 */
   public String toString()
   {
      return quekode + "==" + quename + "\r\n" +
             gebkode + "==" + gebname + "\r\n" +
             jahr + "\r\n" +
             "Gesamtzahl: " + gesamt + "\r\n" +
             altgru[0] + " " + altgru[1] + " " + altgru[2] + " ... " + altgru[16] + " " + altgru[17] + " " + altgru[18];
   }
}
